//
//  SFOrderEncryService.h
//  SefonLockHelpr
//
//  Created by Kai Kang on 2019/1/20.
//  Copyright © 2019 Sefon Group. All rights reserved.
//

#import <Foundation/Foundation.h>

/**
 设备操作类型
 
 - SFDeviceHandleConfigTime: 配置时间
 - SFDeviceHandleConfigIP: 配置IP
 - SFDeviceHandleConfigBlueToothName: 配置蓝牙名称
 - SFDeviceHandleConfigHardwareID: 配置硬件ID
 - SFDeviceHandleQueryIP: 查询IP
 - SFDeviceHandleQueryState: 查询设备状态
 - SFDeviceHandleConfigBalanceParam: 配置平衡参数
 - SFDeviceHandleInitBalanceAngle: 初始化平衡角度
 - SFDeviceHandleQueryBalanceParam: 查询平衡参数
 - SFDeviceHandleConfigUploadTimeSep: 配置主动上报时间间隔
 - SFDeviceHandleConfigBlueToothWaitTimeSep: 配置蓝牙等待时间
 - SFDeviceHandleOpen: 开锁
 - SFDeviceHandleReStart: 重启
 */
typedef NS_ENUM(NSUInteger, SFDeviceHandle) {
    /// 配置时间
    SFDeviceHandleConfigTime,
    /// 配置IP
    SFDeviceHandleConfigIP,
    /// 配置蓝牙名称
    SFDeviceHandleConfigBlueToothName,
    /// 配置硬件ID
    SFDeviceHandleConfigHardwareID,
    /// 查询IP
    SFDeviceHandleQueryIP,
    /// 查询设备状态
    SFDeviceHandleQueryState,
    /// 配置平衡参数
    SFDeviceHandleConfigBalanceParam,
    /// 初始化平衡角度
    SFDeviceHandleInitBalanceAngle,
    /// 查询平衡参数
    SFDeviceHandleQueryBalanceParam,
    /// 配置主动上报时间间隔
    SFDeviceHandleConfigUploadTimeSep,
    /// 配置蓝牙等待时间
    SFDeviceHandleConfigBlueToothWaitTimeSep,
    /// 主动上报
    SFDeviceHandleAutoReply,
    /// 开锁
    SFDeviceHandleOpen,
    /// 重启
    SFDeviceHandleReStart
};

NS_ASSUME_NONNULL_BEGIN

@class SFOrderEncryService;
@protocol SFOrderEncryServiceDelegate <NSObject>

/**
 返回设备产生的数据

 @param service SFOrderEncryService 对象
 @param deviceInfo 设备信息
 @param handleType 当前命令
 @param deviceState 设备状态
 */
- (void)sfOrderEncryService:(SFOrderEncryService *)service didEncrydDeviceInfo:(NSArray *)deviceInfo orderType:(SFDeviceHandle)handleType deviceState:(NSArray *)deviceState;

/**
 自动回复设备
 每次接收到一次命令，都要回复设备
 @param service SFOrderEncryService对象
 @param replyData 回复的内容
 */
- (void)sfOrderEncryService:(SFOrderEncryService *)service autoReply:(NSData *)replyData;


/**
 发送结束，第一次连接到设备的时候，设备会发送数据给app，直到isEnd为true 的时候表示发送结束，才可以执行后续操作

 @param service SFOrderEncryService对象
 @param isEnd 是否发送结束
 */
- (void)sfOrderEncryService:(SFOrderEncryService *)service isEnd:(BOOL)isEnd;


/**
 解密发生错误
 */
- (void)sfOrderEncryServiceEncryError;


@end

@interface SFOrderEncryService : NSObject

@property (nonatomic, weak) id<SFOrderEncryServiceDelegate> delegate;

/// 解密对象
+ (instancetype)sharedInstance;

/// 接收蓝牙发送的数据
- (void)appendOrderData:(NSData *)data;

/**
 向设备发送数据

 @param handle 操作设备的时间类型
 @param param 需要加密的参数
 @return 加密后的数据，可以直接发送给蓝牙
 */
- (NSData *)encodeDeviceHandle:(SFDeviceHandle)handle param:(id)param;

@end

NS_ASSUME_NONNULL_END
